package pos.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import pos.domain.Gusto;
import pos.domain.Oferta;
import pos.domain.Perfil;
import pos.domain.Punto;
import pos.domain.Usuario;
import pos.utils.UIDGenerator;

public class JDBCPerfilDAO implements IPerfilDAO {

	private IUsuarioDAO iu;
	private IOfertaDAO io;

	public JDBCPerfilDAO() {
		iu = new JDBCUsuarioDAO();
		io = new JDBCOfertaDAO();
	}

	public void insertFavorito(String nOferta, Usuario usuario, String nPunto,
			Double longitud, Double latitud, Integer contador) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");

		String sql = "INSERT INTO favoritos ( OID, idUsuario, idOferta, puntuacion ) VALUES ( ?, ?, ?, ?) ";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);
			String idOferta = io.selectIdOfertaByNameOfertaByNamePunto(nOferta,
					nPunto, longitud, latitud);
			stmt.setString(1, UIDGenerator.getInstance().getKey());
			stmt.setString(2, iu.selectOIDUsuarioByName(conn, usuario
					.getNombre()));
			stmt.setString(3, idOferta);
			stmt.setInt(4, contador);

			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Error en JDBCPerfilDAO: insertFavorito");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexi�n correctamente");
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}

	public Perfil selectPerfilByID(Connection conn, String id) {

		PreparedStatement stmt = null;
		ResultSet result = null;
		Perfil perfil = new Perfil();
		try {

			String sql = "SELECT * FROM perfiles WHERE OID=?";

			stmt = conn.prepareStatement(sql);
			stmt.setString(1, id);

			result = stmt.executeQuery();
			if (result.next()) {

				perfil.setNombre(result.getString("nombre"));
				perfil.setApellidos(result.getString("apellidos"));
				perfil.setDirreccion(result.getString("direccion"));
				perfil.setPoblacion(result.getString("poblacion"));
				perfil.setProvincia(result.getString("provincia"));
			}

		} catch (SQLException e) {
			System.out.println("Error en JDBCPerfilDAO selectPerfilById");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			try {
				if (result != null)
					result.close();
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}

		}
		return perfil;
	}

	public Map<Oferta, Integer> selectFavoritasByPuntoByUsuario(String nick,
			Punto punto) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out
				.println("se ha creado correctamente la conexion (en selectFavoritasByPuntoByUsuario)");

		Map<Oferta, Integer> mapRes = new HashMap<Oferta, Integer>();
		List<String> oidsOfertasDelPunto = new LinkedList<String>();

		String oidUsuario = "";
		String oidOferta = "";
		String oidPunto = "";

		IUsuarioDAO uDAO = new JDBCUsuarioDAO();
		IPuntoDAO pDAO = new JDBCPuntoDAO();
		IOfertaDAO oDAO = new JDBCOfertaDAO();
		PreparedStatement stmt = null;
		ResultSet result = null;
		String sql = "SELECT * FROM favoritos WHERE (idUsuario = ?) ";

		try {

			stmt = conn.prepareStatement(sql);

			oidUsuario = uDAO.selectOIDUsuarioByName(conn, nick);
			oidPunto = pDAO.selectIdPuntoByPunto(conn, punto);
			oidsOfertasDelPunto = oDAO.selectOIDSOfertasByPunto(conn, oidPunto);

			stmt.setString(1, oidUsuario);

			result = stmt.executeQuery();

			while (result.next()) {
				oidOferta = result.getString("idOferta");
				if (oidsOfertasDelPunto.contains(oidOferta)) {
					Integer puntuacion = result.getInt("puntuacion");
					mapRes.put(oDAO.selectOfertaById(conn, oidOferta),
							puntuacion);
				}
			}

		} catch (SQLException e) {
			System.out
					.println("Error en JDBCOfertaDAO selectFavoritasByPuntoByUsuario");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out
					.println("Se ha cerrado la conexi�n correctamente( en selectFavoritasByPuntoByUsuario)");
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return mapRes;
	}

	public void insertPerfil(String nombre, String apellidos, String direccion,
			String poblacion, String provincia, String nick) {
		iu = new JDBCUsuarioDAO();
		Connection conn = ConnectionManager.getInstance().checkOut();
		Usuario u = iu.selectUsuarioByName(nick);
		String id_usuario = iu.selectOIDUsuarioByName(conn, u.getNombre());
		String sql = "INSERT INTO perfiles (nombre, apellidos, poblacion, provincia, direccion, idUsuario,OID ) VALUES (?, ?, ?, ?, ?, ?,?) ";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);

			stmt.setString(1, nombre);
			stmt.setString(2, apellidos);
			stmt.setString(3, poblacion);
			stmt.setString(4, provincia);
			stmt.setString(5, direccion);
			stmt.setString(6, id_usuario);
			stmt.setString(7, UIDGenerator.getInstance().getKey());

			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Error en JDBCPerfilDAO insertPerfil");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}

	}

	public void insertGustos(Gusto g, Usuario u) {

		Connection conn = ConnectionManager.getInstance().checkOut();
		iu = new JDBCUsuarioDAO();
		String idUsuario = iu.selectOIDUsuarioByName(conn, u.getNombre());
		String sql = "INSERT INTO gustos (idUsuario,estadoCivil,deportesFavoritos,frecuenciaSalida,trabajo,OID) VALUES ( ?, ?, ?, ?,?,?) ";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);

			stmt.setString(1, idUsuario);
			stmt.setString(2, g.getEstadoCivil());
			stmt.setInt(3, g.haceDeporte());
			stmt.setString(4, g.getFrecuenciaSalida());
			stmt.setString(5, g.getTrabajo());
			stmt.setString(6, UIDGenerator.getInstance().getKey());

			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Error en JDBCPerfilDAO: insertGusto");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}

	public void updatePerfil(String nombre, String apellidos, String direccion,
			String poblacion, String provincia, String nick) {
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");
		IUsuarioDAO iu = new JDBCUsuarioDAO();
		String OIDusuario = iu.selectOIDUsuarioByName(conn, nick);

		PreparedStatement stmt = null;
		try {
			String sql = "UPDATE perfiles SET nombre=?, apellidos=?, poblacion=?, provincia=?, direccion=? WHERE idUsuario  LIKE '"
					+ OIDusuario + "';";

			stmt = conn.prepareStatement(sql);
			stmt.setString(1, nombre);
			stmt.setString(2, apellidos);
			stmt.setString(3, poblacion);
			stmt.setString(4, provincia);
			stmt.setString(5, direccion);

			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Error en JDBCPerfilDAO updatePerfil");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexión correctamente");
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}

	}

	public void updateFavorito(String nombreOferta, Usuario usuario,
			String nombrePunto, Double longitud, Double latitud,
			Integer puntuacion) {

		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Se ha creado la conexion correctamente");

		String sql = "UPDATE favoritos Set puntuacion=? WHERE idUsuario=? AND idOferta=? ";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);
			String idOferta = io.selectIdOfertaByNameOfertaByNamePunto(
					nombreOferta, nombrePunto, longitud, latitud);

			stmt.setInt(1, puntuacion);
			stmt.setString(2, iu.selectOIDUsuarioByName(conn, usuario
					.getNombre()));
			stmt.setString(3, idOferta);

			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Error en JDBCPerfilDAO: updateFavorito");
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Se ha cerrado la conexi�n correctamente");
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}

}
